package org.xx.armory.db.junit.impl;

import org.xx.armory.db.junit.DbUnitHelper;

import javax.sql.DataSource;

/**
 * 用于MySql数据库的单元测试工具类。
 *
 * @author Haart
 */
public class MySqlDbUnitHelper
        extends AbstractDbUnitHelper
        implements DbUnitHelper {
    /**
     * 构造用于MySql数据库的单元测试工具类。
     *
     * @param dataSource
     *         此工具类使用的数据源。
     * @throws NullPointerException
     *         如果参数{@code dataSource}是{@code null}。
     */
    public MySqlDbUnitHelper(
            DataSource dataSource
    ) {
        super(dataSource);
    }

    /**
     * 构造{@code OracleDbUnitHelper}类型实例。
     *
     * @param url
     *         连接数据库的URL, 会被正规化。
     * @param user
     *         连接数据库的用户名, 会被正规化。
     * @param password
     *         连接数据库的口令, 会被正规化。
     * @throws NullPointerException
     *         如果参数{@code url}是{@code null}, 或者参数{@code user}是{@code null}。
     * @throws IllegalArgumentException
     *         如果参数{@code url}只包含空白字符, 或者参数{@code user}只包含空白字符。
     */
    public MySqlDbUnitHelper(
            String url,
            String user,
            String password
    ) {
        super(url, user, password);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    protected String wrap(
            String identity
    ) {
        return "`" + identity + "`";
    }

    /**
     * 重置表的自增列当前值为{@code 1}。
     *
     * @param tableName
     *         表名。
     * @throws IllegalArgumentException
     *         如果参数{@code tableName}是{@code null}或者只包含空白字符。
     * @throws org.xx.armory.db.DbException
     *         如果执行重置命令时出现数据库错误。
     */
    public void resetAutoKey(
            String tableName
    ) {
        resetAutoKey(tableName, 1L);
    }

    /**
     * 重置表的自增列当前值。
     *
     * @param tableName
     *         表名。
     * @param value
     *         新的当前值。
     * @throws IllegalArgumentException
     *         如果参数{@code tableName}是{@code null}或者只包含空白字符。
     * @throws org.xx.armory.db.DbException
     *         如果执行重置命令时出现数据库错误。
     */
    public void resetAutoKey(
            String tableName,
            long value
    ) {
        ddl("ALTER TABLE " + wrap(tableName) + " AUTO_INCREMENT = " + value);
    }
}
